#include "meushell.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

// Variáveis internas
char *args[ARGS_S];
int bg;
// Fim-Variáveis internas

// Variáveis de ambiente
char host[HOST_S];
char pronto[PRONTO_S];
char shell[SHELL_S];
char dta[DTA_S];
char caminho[CAMINHO_S];
// Fim-Variáveis de ambiente

int main(int argc, char *argv[])
{
    int readerflag = 0;
    FILE *reader, *hist;
    if(argc == 2){
        reader = fopen(argv[1], "r");
        if(reader == NULL){
            printf("falha ao abrir o arquivo %s, saindo...", argv[1]);
        }
        readerflag = 1;
    }
    
    // Inicializa as variáveis de ambiente
    gethostname(host, HOST_S);
    getcwd(dta, 1024);
    strcpy(caminho, "/bin/:/usr/bin/:/home/");
    strcpy(pronto, "Meushell@");
    strcat(pronto, host);
    strcat(pronto, "$");
    
    FILE *file = fopen(".meushell.rec", "r"); // leitura do arquivo
    if(file != NULL){
        char *buff = (char *)malloc(sizeof(char) * 1024);
        while(!feof(file)) {
            fgets(buff, 1024, file);
            if(buff[0] == '\0') break;
            
            input_clean(buff);
            
            // apenas constroi os argumentos no vetor
            bg = 0; // variáveis não serão utilizadas...
            const_args(buff, args, &bg);
            
            ambaction();
        }
        fclose(file);
    }
    limpaargs();
    
    char *line = malloc(100 * sizeof(char));
    limpa();
    printf("**** Bem vindo ao myShell *****\n\ndta: %s\n", dta);

    while(1){
        printf("%s ", pronto);
        fflush(stdout);
        
        // verifica se a leitura pe feita por arquivo
        if(readerflag){
            if(fgets(line, 100, reader) == NULL){
                readerflag = 0;
                continue;
            }
            // quebra uma linha, pois a leitura sera feita por arquivo
            printf("\n");
        }
        // leitura por teclado
        else {
            fgets(line, 100, stdin);
        }
        
        // se a entrada for apenas uma quebra de linha, volta o laço
        input_clean(line);
        if(line[0] == '\n' || line == NULL) continue;
        
        // grava historico
        if(verificaReplica(line)){
            hist = fopen(".meushell.hst", "a"); // abre o arquivo do historico
            fprintf(hist, "%s\n", line);
            fclose(hist);
        }
        
        bg = 0;
        // verifica se a execução será em pipe ou não
        if(strchr(line,'|') == NULL){
            const_args(line, args, &bg);
        }
        else {
            executa_piped(split(line, "|"), 0);
            continue;
        }
        
        if(strcmp(args[0], "sair") == 0){
            printf("obrigado pela preferência, volte sempre... ;D \n");
            return 0;
        }
        else if(strcmp(args[0], "limpa") == 0){
            limpa();
        }
        else if(strcmp(args[0], "ajuda") == 0){
            ajuda();
        }
        // comando amb
        else if(strcmp(args[0], "amb") == 0){
            ambaction();
        }
        // executa um comando
        else {
            if(strcmp(args[0], "cd") == 0){
                if(chdir(args[1]) != 0){
                    printf("diretório %s inválido\n", args[1]);
                } else {
                    getcwd(dta, 1024);
                }
                printf("dta: %s\n", dta);
            }
            else if(verifica_caminho(args[0])){
                executa(args, bg);
            }
            else {
                printf("comando %s inválido\n", args[0]);
            }
        }
        limpaargs();
        bzero(line, strlen(line));
    }

    printf("obrigado pela preferência, volte sempre... ;D \n");
    return 0;
}

